Tensorlistsetitem ================= 将输入的张量(item)替换到张量列表(TensorList)中指定索引位置。该算子创建一个新的张量列表,其中在指定索引位置的张量被替换为输入的新张量,而其他位置的张量保持不变。 该算子不区分具体的数据类型,通过copy_size参数指定每个张量的数据量大小。 输入: - **in_data** - 输入张量列表指针(void**类型),指向原始张量列表中的各个张量数据。 - **in_item** - 输入张量指针(void*类型),表示要替换到张量列表中的新张量数据。 - **index** - 要替换的张量在列表中的索引位置(int类型)。 - **tensorlist_size** - 张量列表中包含的张量个数(int类型)。 - **copy_size** - 每个张量的数据量大小数组(int*类型),以字节为单位,表示每个张量需要复制的字节数。 - **core_mask** - 核掩码(int类型),仅共享存储版本需要。 输出: - **out_data** - 输出张量列表指针(void**类型),存储替换操作后的张量列表,其中index位置的张量被替换为in_item。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - 该算子不区分具体的数据类型,通过copy_size参数控制复制的字节数 - 调用前需要确保out_data指向的内存空间足够大,能够存储所有张量数据 - 索引index必须在有效范围内(0 <= index < tensorlist_size) - 算子会复制所有张量数据,输出张量列表与输入张量列表数据独立 **共享存储版本:** .. c:function:: void tensorlistsetitem_s(void** in_data, void* in_item, void** out_data, int index, int tensorlist_size, int* copy_size, int core_mask) **C调用示例(共享存储版本):** .. code-block:: c :linenos: :emphasize-lines: 31 #include #include int main(int argc, char* argv[]) { // 假设在DDR空间 int tensorlist_size = 3; // 张量列表包含3个张量 int index = 1; // 替换索引为1的张量 // 输入张量列表 float *in_tensor0 = (float *)0xA0000000; float *in_tensor1 = (float *)0xA0010000; float *in_tensor2 = (float *)0xA0020000; void* in_data[3] = {in_tensor0, in_tensor1, in_tensor2}; // 输入item float *in_item = (float *)0xA0030000; // 输出张量列表 float *out_tensor0 = (float *)0xB0000000; float *out_tensor1 = (float *)0xB0010000; float *out_tensor2 = (float *)0xB0020000; void* out_data[3] = {out_tensor0, out_tensor1, out_tensor2}; // 每个张量的数据量大小 int copy_size[3] = {40, 40, 40}; // 核掩码 int core_mask = 0xff; // 调用共享存储版本的函数 tensorlistsetitem_s(in_data, in_item, out_data, index, tensorlist_size, copy_size, core_mask); return 0; } **私有存储版本:** .. c:function:: void tensorlistsetitem_p(void** in_data, void* in_item, void** out_data, int index, int tensorlist_size, int* copy_size) **C调用示例(私有存储版本):** .. code-block:: c :linenos: :emphasize-lines: 28 #include #include int main(int argc, char* argv[]) { // 假设在L2空间 int tensorlist_size = 3; // 张量列表包含3个张量 int index = 1; // 替换索引为1的张量 // 输入张量列表(假设已初始化) float *in_tensor0 = (float *)0x10000000; // 第一个张量 float *in_tensor1 = (float *)0x10001000; // 第二个张量(将被替换) float *in_tensor2 = (float *)0x10002000; // 第三个张量 void* in_data[3] = {in_tensor0, in_tensor1, in_tensor2}; // 输入item(新张量数据) float *in_item = (float *)0x10003000; // 输出张量列表(需要预先分配内存) float *out_tensor0 = (float *)0x10004000; float *out_tensor1 = (float *)0x10005000; float *out_tensor2 = (float *)0x10006000; void* out_data[3] = {out_tensor0, out_tensor1, out_tensor2}; // 每个张量的数据量大小(假设每个张量有10个float元素,每个float 4字节) int copy_size[3] = {40, 40, 40}; // 40字节 = 10 * 4 // 调用私有存储版本的函数 tensorlistsetitem_p(in_data, in_item, out_data, index, tensorlist_size, copy_size); return 0; }